package com.kanshu.basictest.ui.activity.basic.annotation;

import android.view.View;
import android.widget.AdapterView;

import com.kanshu.basictest.R;
import com.kanshu.basictest.model.menu.MenuItem;
import com.kanshu.basictest.ui.base.BaseListMenuActivity;

import java.lang.annotation.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 1.元注解是Java中最最基本的注解。
 * 2.元注解是用于对注解进行注解的注解。即，对其它的注解（也可能是其本身)进行介绍说明。
 */
public class FiveMetaAnnotationActivity extends BaseListMenuActivity {


    @Override
    protected String provideBarTitle() {
        return "AndroidBasicTest";
    }

    public static final String TAG = "五个元注解";


    @Override
    protected List<? extends MenuItem> provideMenuData() {
        List<MenuItem> menuItems = new ArrayList<>();
        menuItems.add(0, new MenuItem("@Retention", R.color.brown_300));//@Retention
        menuItems.add(1, new MenuItem("@Documented", R.color.brown_300));//@Documented
        menuItems.add(2, new MenuItem("@Target", R.color.brown_300));//@Target
        menuItems.add(3, new MenuItem("@Inherited", R.color.brown_300));//@Inherited
        menuItems.add(4, new MenuItem("@Repeatable", R.color.brown_300));//@Repeatable

        return menuItems;
    }

    @Override
    protected void init() {
        super.init();
    }

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
        switch (position) {
            case 0://@Retention
                break;
            case 1://@Documented
                break;
            case 2://@Target
                break;
            case 3://@Inherited
                break;
            case 4://@Repeatable
                break;

        }
    }

    /**
     * Retention 注解：
     * <p>
     * {@link Retention}
     * <p>
     * 定义：“保留”注解
     * <p>
     * 作用:解释说明注解的生命周期
     * <p>
     * 参数：RetentionPolicy 共有三种：
     * >>>{@link RetentionPolicy#RUNTIME} ：注解保留到程序运行时 &  会被编译进class文件，也会被加载进入到 JVM 中，所以在程序运行时可以获取到它们
     * >>>{@link RetentionPolicy#CLASS}:这是默认行为，注解只被保留到编译进行时 & 会被编译进class文件，但不会被加载到 JVM
     * >>>{@link RetentionPolicy#SOURCE}:注解只在源码阶段保留 & 在编译器进行编译时将被丢弃忽视。
     */
    private void testRetention() {

    }

    /**
     * Documented 注解：
     * <p>
     * {@link Documented}
     * <p>
     * 定义：“文档”注解
     * <p>
     * 作用:将注解中的元素包含到 Javadoc文档中
     * <p>
     */
    private void testDocumented() {

    }

    /**
     * Target 注解：
     * <p>
     * {@link Target}
     * <p>
     * 定义：“目标”注解
     * <p>
     * 作用:限定了注解作用的目标范围，包括类、方法等等
     * <p>
     * 参数：ElementType 共有十种：
     * >>>{@link ElementType#TYPE} ：表示该注解可用于注解 广义的“类”（包括 类、接口、注解、枚举）。
     * >>>{@link ElementType#FIELD} ：表示该注解可用于注解 “成员变量”（包括 枚举中的常量）。
     * >>>{@link ElementType#METHOD} ：表示该注解可用于注解 “方法”
     * >>>{@link ElementType#PARAMETER} ：表示该注解可用于注解 “参数”
     * >>>{@link ElementType#CONSTRUCTOR} ：表示该注解可用于注解 “构造方法”
     * >>>{@link ElementType#LOCAL_VARIABLE} ：表示该注解可用于注解 “局部变量”
     * >>>{@link ElementType#ANNOTATION_TYPE} ：表示该注解可用于注解 “注解"
     * >>>{@link ElementType#PACKAGE} ：表示该注解可用于注解 “包”
     * >>>{@link ElementType#TYPE_PARAMETER} ：待确定
     * >>>{@link ElementType#TYPE_USE} ：待确定
     *
     *注意：
     * 1.如果一个自定义的注解上没有使用@Target限制注解的作用范围，则注解的使用范围为除了类类型参数声明的其它注解。
     *   即，除了{@link ElementType#TYPE_PARAMETER}的其它九种类型。
     *
     *
     *
     *
     */
    private void testTarget() {

    }

    /**
     * Inherited 注解：
     * <p>
     * {@link Inherited}
     * <p>
     * 定义：“继承”注解
     * <p>
     * 作用:使得一个 被@Inherited 注解的注解 所作用的类的子类可以继承该类的注解
     * <p>
     * 说明：表示被@Inherited 注解的注解将会被自动继承。如果一个注解在声明时，使用了@Inherited注解；并且在声明一个类时使用了该注解（ 被@Inherited 注解的注解）；另外，
     * 该类没有使用其它的被@Inherited 注解的注解，那么，该类的子类会自动使用该注解 （被@Inherited 注解的注解）。
     */
    private void testInherited() {

    }

    /**
     * Repeatable 注解：
     * <p>
     * {@link Repeatable}
     * <p>
     * 定义：“重复”注解
     * <p>
     * 作用: 如果一个在定义注解是使用了@Repeatable,那么意味着可使用该注解对同一目标进行多次注解。
     */
    private void testRepeatable() {

    }

}
